/* 
  Set和WeakSet数据结构
    这节学习Set数据结构，注意这里不是数据类型，而是数据结构。它是ES6中新的东西，并且很有用处。Set的数据结构是以数组的形式构建的。

  ------------------------------------------------------------------------------------------------------

  Set的声明
    let setArr = new Set(['jspang','技术胖','web','jspang']);
    console.log(setArr);  //Set {"jspang", "技术胖", "web"}
  
  Set和Array 的区别是Set不允许内部有重复的值，如果有只显示一个，相当于去重。虽然Set很像数组，但是他不是数组。  

  ------------------------------------------------------------------------------------------------------
  
  Set值的增删查

    追加add：
      在使用Array的时候，可以用push进行追加值，那Set稍有不同，它用更语义化的add进行追加。
    let setArr = new Set(['jspang','技术胖','web','jspang']);
    console.log(setArr);//Set {"jspang", "技术胖", "web"}
    setArr.add('前端职场');
    console.log(setArr);  

    删除delete：
      let setArr = new Set(['jspang','技术胖','web','jspang']);
      console.log(setArr);//Set {"jspang", "技术胖", "web"}
      
      setArr.add('前端职场');
      console.log(setArr); //Set {"jspang", "技术胖", "web", "前端职场"}
      
      setArr.delete('前端职场');
      console.log(setArr); //Set {"jspang", "技术胖", "web"} 
      
    查找has：  
      用has进行值的查找，返回的是true或者false。

    let setArr = new Set(['jspang','技术胖','web','jspang']);
    console.log(setArr);//Set {"jspang", "技术胖", "web"}
    console.log(setArr.has('jspang'));//true  

    删除clear:
    let setArr = new Set(['jspang','技术胖','web','jspang']);
    console.log(setArr);//Set {"jspang", "技术胖", "web"}
    setArr.clear();
    console.log(setArray);//true

  ------------------------------------------------------------------------------------------------------

  set的循环

  for…of…循环：
    let setArr = new Set(['jspang','技术胖','web','jspang']);
    for (let item of setArr){
        console.log(item);
    }

  size属性: 
    size属性可以获得Set值的数量。
  let setArr = new Set(['jspang','技术胖','web','jspang']);
  for (let item of setArr){
      console.log(item);
  }
  console.log(setArr.size);
  
  forEach循环:
    let setArr = new Set(['jspang','技术胖','web','jspang']);
    setArr.forEach((value)=>console.log(value));

  ------------------------------------------------------------------------------------------------------
    
  WeakSet的声明 

  let weakObj=new WeakSet();
  let obj={a:'jspang',b:'技术胖'}
  weakObj.add(obj);
  console.log(weakObj);

  ★这里需要注意的是，如果你直接在new 的时候就放入值，将报错。

  WeakSet里边的值也是不允许重复的，我们来测试一下。
  let weakObj=new WeakSet();
  let obj={a:'jspang',b:'技术胖'}
  let obj1=obj;
  
  weakObj.add(obj);
  weakObj.add(obj1);
  
  console.log(weakObj);

  总结：在实际开发中Set用的比较多，WeakSet用的并不多，但是他对传入值必须是对象作了很好的判断，我们灵活应用还是有一定的用处的。

*/

// Set的声明
let setArr=new Set(['zhouwenfei','周文飞','web','25']);
// console.log(typeof setArr);  //object  实际是一个对象
// console.log(setArr); //Set(4) {"zhouwenfei", "周文飞", "web", "25"}

// 错误写法
// let setArr2=new Set([("a":'wenfei'),"b":'afei']);  //里面不可以按照对象方式写,直接报错
// console.log(setArr2);


// Set值的增删查

// 追加add：
let setArr3=new Set(['afei','Dfei']);
// console.log(setArr3);  //index.js:108 Set(2) {"afei", "Dfei"}
// console.log(setArr3.add('前端工程师'));  //Set(3) {"afei", "Dfei", "前端工程师"}
// console.log(setArr3);  //Set(3) {"afei", "Dfei", "前端工程师"}

// 删除delete：
let setArr4=new Set(['afei','Dfei']);
setArr4.delete('Dfei');
// setArr4.delete();  //如果里面没加,则什么都不干,加才会起作用
// console.log(setArr4);  //Set(1) {"afei"}

// 清空clear:   区别delete ,这个是清空 ,不管里面有没有加参数,都是清空
let setArr5=new Set(['afei','Dfei']);
setArr5.clear('Dfei');
// console.log(setArr5);  //Set(0) {}



// 查找has：  返回的是true或者false。
let setArr6=new Set(['afei','Dfei']);
// console.log(setArr6.has('Dfei'));  //true


// set的循环

// for…of…循环：
let setArr7=new Set(['afei','Dfei']);
// console.log(setArr7);
for(let val of setArr7){  //虽然他是对象类型,但是用的是数组的遍历方法
  // console.log(val);
}
// 错误遍历方法,不使用对象的遍历方法
for(let val in setArr7){  
  // console.log(setArr7[val]);
}

// forEach循环
let setArr8=new Set(['afei','Dfei']);
setArr8.forEach((val,index,...amd)=>{
  // console.log(amd.length);  //1 只有一个参数, 所以写index也没用,也是取得是val值
  // console.log(val+":"+index);
})

// size属性
let setArr9=new Set(['afei','Dfei']);
// console.log(setArr9.size);  // 2

// ★ Set不允许内部有重复的值，如果有只显示一个，相当于去重
let setArr10=new Set();
let obj2={a:'afei',b:'Dfei'};
// let obj3=[...obj2];  //这种写法是错误的 ,只有数组才可以这么干,对象不可以,报错  obj2 is not iterable(obj2是不可迭代的)
let obj3={...obj2};  //对象用{...} 这种,和数组区别开来 ,这样修改obj3的值,不会影响到obj2
obj3.a='zhouDfei';
console.log(obj3,obj2);  //{a: "zhouDfei", b: "Dfei"} {a: "afei", b: "Dfei"}
setArr10.add(obj2);
console.log(setArr10);  // afei  Dfei  重复的Dfei不会出现多次


// WeakSet的声明

let weakObj=new WeakSet();
// console.log(weakObj);  //WeakSet {}
// console.log(typeof weakObj);  //object
let obj8={a:'afei',b:'Dfei'};
weakObj.add(obj8);
// console.log(weakObj);


// WeakSet的声明和Set的区别, new Set()里面可以直接写值, WeakSet不行,会报错

// WeakSet里边的值也是不允许重复的，我们来测试一下。
let weakObj2=new WeakSet();
let obj9={a:'afei',b:'Dfei'};
let obj10=obj9;
weakObj2.add(obj9);
weakObj2.add(obj10);
// console.log(weakObj2);  //只会出现一次,不会重复

